/***********************************************************************************
 * 文件名： mcu_exti.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		exti 驱动。
 * 修改记录：
 * 	2024/9/21: 初版。 刘言。
***********************************************************************************/
#ifndef _MCU_EXTI_H_
#define _MCU_EXTI_H_

#include "mcu.h"

typedef enum _exti_line_t
{
    EXTI_LINE_0 = 1 << 0, 
    EXTI_LINE_1 = 1 << 1, 
    EXTI_LINE_2 = 1 << 2, 
    EXTI_LINE_3 = 1 << 3, 
    EXTI_LINE_4 = 1 << 4, 
    EXTI_LINE_5 = 1 << 5, 
    EXTI_LINE_6 = 1 << 6, 
    EXTI_LINE_7 = 1 << 7, 
    EXTI_LINE_17 = 1 << 17, EXTI_LINE_COMP1 = 1 << 17,
    EXTI_LINE_18 = 1 << 18, EXTI_LINE_COMP2 = 1 << 18,
    EXTI_LINE_ALL_PIN = 0XFFFF,
    EXTI_LINE_ALL = 0X0FFFFFFF
}exti_line_t;


/**
 * 按照配置文件初始化EXTI。
 * 未配置NVIC。NVIC配置示例:NVIC_SetPriority(EXTI0_1_IRQn, 0);NVIC_EnableIRQ(EXTI0_1_IRQn);
 */
void Exti_Init();

/**
 * 获取中断标志
 * @param flag 哪个 EXTI LINE 标志，取值见 exti_line_t 。多个状态可用 | 连接，只要其中一个状态有效就会返回true。
 */
STATIC_FORCE_IN_LINE bool Exti_GetIntFlag(exti_line_t flag)
{
    return ((EXTI->PR & (flag)) > 0);
}

/**
 * 清除中断标志
 * @param flag 哪个 EXTI LINE 标志，取值见 exti_line_t 。多个状态可用 | 连接，一次清除。
 */
STATIC_FORCE_IN_LINE void Exti_ClrIntFlag(exti_line_t flag)
{
    EXTI->PR = flag;
}

STATIC_FORCE_IN_LINE void Exti_EnableInt(exti_line_t line)
{
    EXTI->IMR |= line;
}

STATIC_FORCE_IN_LINE void Exti_DisableInt(exti_line_t line)
{
    EXTI->IMR &= ~line;
}

#endif
